package com.example.lettcode._202410._20241022;

import com.example.lettcode.node.ListNode;

import java.util.ArrayList;
import java.util.List;

/*
82. 删除排序链表中的重复元素 II
给定一个已排序的链表的头 head ， 删除原始链表中所有重复数字的节点，只留下不同的数字 。返回 已排序的链表 。

示例 1：
输入：head = [1,2,3,3,4,4,5]
输出：[1,2,5]

示例 2：
输入：head = [1,1,1,2,3]
输出：[2,3]
 */
public class _3_Shan_chu_chong_fu_yuan_su {
    public static void main(String[] args) {
        ListNode list1 = new ListNode(1);
        ListNode list2 = new ListNode(2);
        ListNode list3 = new ListNode(3);
        ListNode list4 = new ListNode(3);
        ListNode list5 = new ListNode(4);
        ListNode list6 = new ListNode(4);
        ListNode list7 = new ListNode(5);
        list1.next = list2;
        list2.next = list3;
        list3.next = list4;
        list4.next = list5;
        list5.next = list6;
        list6.next = list7;
        ListNode listNode = deleteDuplicates(list1);
        System.out.println(listNode);
    }

    /*
        大致思路：
            获取当前节点，比较：当前节点的下一个节点和下下个节点
                不同：遍历下一个节点
                相同：获取当前节点的下一个节点的值
                    循环遍历后续节点是否与当前值相等
                    相等则剔除该节点，直到与该值不相同时，则遍历当前节点的下一个节点
     */
    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }

        ListNode node = new ListNode(-1, head);
        ListNode node1 = node;
        while (node1.next != null && node1.next.next != null) {
            if (node1.next.val == node1.next.next.val) {
                int x = node1.next.val;
                while (node1.next != null && node1.next.val == x) {
                    node1.next = node1.next.next;
                }
            } else {
                node1 = node1.next;
            }
        }
        return node.next;
    }
}
